package ar.com.age.distribuidora.presentacion.controller;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;

import ar.com.age.distribuidora.dominio.Gerente;
import ar.com.age.distribuidora.dominio.Localidad;
import ar.com.age.distribuidora.presentacion.util.Mensajes;
import ar.com.age.distribuidora.presentacion.util.ServiceLocator;
import ar.com.age.distribuidora.presentacion.util.ValidadorTipoUsuario;

@ManagedBean
@ViewScoped
public class GerenteBean {

	private String nombreRegistrar;
	
	private String apellidoRegistrar;
	
	private String codigoRegistrar;
	
	private String contraseniaRegistrar;
	
	private Localidad localidadSeleccionadaRegistrar;
	
	private List<Localidad> localidades;
	
	private Gerente gerenteSeleccionado;  
    
    private Gerente gerenteSeleccionadoDetalles;  

	private String codigoBuscar;
	
	private String nombreBuscar;
	
	private String apellidoBuscar;
	
	private String estadoBuscar;
	
	private List<Gerente> gerentes;
	
	private Localidad localidadAux;
	
	private String nombreLocalidad;

	private boolean panelBuscarVisibilidad;
	
	private boolean panelEditarVisibilidad;

	private boolean panelRegistrarVisibilidad;
	
    
	public GerenteBean() {

		ValidadorTipoUsuario.validarAdministrador();
		
		this.localidades = ServiceLocator.getLocalidadService().buscarTodos();

		this.panelEditarVisibilidad = false;
		this.panelRegistrarVisibilidad = true;
		this.panelBuscarVisibilidad = false;

	}

	public Localidad getLocalidadAux() {
		return localidadAux;
	}

	public void setLocalidadAux(Localidad localidadAux) {
		this.localidadAux = localidadAux;
	}

	public boolean isPanelBuscarVisibilidad() {
		return panelBuscarVisibilidad;
	}

	public void setPanelBuscarVisibilidad(boolean panelBuscarVisibilidad) {
		this.panelBuscarVisibilidad = panelBuscarVisibilidad;
	}

	public String getNombreLocalidad() {
		return nombreLocalidad;
	}

	public void setNombreLocalidad(String nombreLocalidad) {
		this.nombreLocalidad = nombreLocalidad;
	}

	public boolean isPanelEditarVisibilidad() {
		return panelEditarVisibilidad;
	}

	public void setPanelEditarVisibilidad(boolean panelEditarVisibilidad) {
		this.panelEditarVisibilidad = panelEditarVisibilidad;
	}

	public boolean isPanelRegistrarVisibilidad() {
		return panelRegistrarVisibilidad;
	}

	public void setPanelRegistrarVisibilidad(boolean panelRegistrarVisibilidad) {
		this.panelRegistrarVisibilidad = panelRegistrarVisibilidad;
	}

	public String getNombreRegistrar() {
		return nombreRegistrar;
	}

	public void setNombreRegistrar(String nombreRegistrar) {
		this.nombreRegistrar = nombreRegistrar;
	}

	public String getApellidoRegistrar() {
		return apellidoRegistrar;
	}

	public void setApellidoRegistrar(String apellidoRegistrar) {
		this.apellidoRegistrar = apellidoRegistrar;
	}

	public String getCodigoRegistrar() {
		return codigoRegistrar;
	}

	public void setCodigoRegistrar(String codigoRegistrar) {
		this.codigoRegistrar = codigoRegistrar;
	}

	public String getContraseniaRegistrar() {
		return contraseniaRegistrar;
	}

	public void setContraseniaRegistrar(String contraseniaRegistrar) {
		this.contraseniaRegistrar = contraseniaRegistrar;
	}

	public Localidad getLocalidadSeleccionadaRegistrar() {
		return localidadSeleccionadaRegistrar;
	}

	public void setLocalidadSeleccionadaRegistrar(
			Localidad localidadSeleccionadaRegistrar) {
		this.localidadSeleccionadaRegistrar = localidadSeleccionadaRegistrar;
	}

	public List<Localidad> getLocalidades() {
		return localidades;
	}

	public void setLocalidades(List<Localidad> localidades) {
		this.localidades = localidades;
	}

	public Gerente getGerenteSeleccionado() {
		return gerenteSeleccionado;
	}

	public void setGerenteSeleccionado(Gerente gerenteSeleccionado) {
		this.gerenteSeleccionado = gerenteSeleccionado;
	}

	public Gerente getGerenteSeleccionadoDetalles() {
		return gerenteSeleccionadoDetalles;
	}

	public void setGerenteSeleccionadoDetalles(Gerente gerenteSeleccionadoDetalles) {
		this.gerenteSeleccionadoDetalles = gerenteSeleccionadoDetalles;
	}

	public String getCodigoBuscar() {
		return codigoBuscar;
	}

	public void setCodigoBuscar(String codigoBuscar) {
		this.codigoBuscar = codigoBuscar;
	}

	public String getNombreBuscar() {
		return nombreBuscar;
	}

	public void setNombreBuscar(String nombreBuscar) {
		this.nombreBuscar = nombreBuscar;
	}

	public String getApellidoBuscar() {
		return apellidoBuscar;
	}

	public void setApellidoBuscar(String apellidoBuscar) {
		this.apellidoBuscar = apellidoBuscar;
	}

	public String getEstadoBuscar() {
		return estadoBuscar;
	}

	public void setEstadoBuscar(String estadoBuscar) {
		this.estadoBuscar = estadoBuscar;
	}

	public List<Gerente> getGerentes() {
		return gerentes;
	}

	public void setGerentes(List<Gerente> gerentes) {
		this.gerentes = gerentes;
	}
	
	
	
	// Metodos del Bean
	
	public String registrarGerente() {
		
		Gerente gerente = new Gerente();
		gerente.setApellido(apellidoRegistrar);
		gerente.setCodigo(codigoRegistrar);
		gerente.setContrasenia(contraseniaRegistrar);
		gerente.setEstado("Activo");
		gerente.setNombre(nombreRegistrar);
		gerente.setTipoUsuario("G");
		gerente.setLocalidad(this.localidadSeleccionadaRegistrar);
		
		ServiceLocator.getUsuarioService().crearOEditarGerente(gerente);
		
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "La operacion se ha realizado con exito.");  
		RequestContext.getCurrentInstance().showMessageInDialog(message);
		
		apellidoRegistrar = null;
		codigoRegistrar = null;
		contraseniaRegistrar = null;
		nombreRegistrar = null;
		localidadSeleccionadaRegistrar = null;
		
		return null;
	}
	
	
	public String actualizarGerente() {
		
		if (this.gerenteSeleccionado != null) {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Gerente",  "Gerente editado con exito.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
	        
	        if (this.gerenteSeleccionado.getLocalidad() == null) {
	        	this.gerenteSeleccionado.setLocalidad(this.localidadAux);
			}
	        
			ServiceLocator.getUsuarioService().crearOEditarGerente(this.gerenteSeleccionado);
			this.gerenteSeleccionado = null;

			// para reestablecer los valores
			this.localidadAux = null;
			this.nombreLocalidad = null;
			// para volver a setear la lista con todas las ciudades
			this.localidades = ServiceLocator.getLocalidadService().buscarTodos();

			this.panelEditarVisibilidad = false;
			this.panelRegistrarVisibilidad = true;
		 
			return null;
		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Gerente",  "No se ha seleccionado un gerente.");  
	        FacesContext.getCurrentInstance().addMessage(null, message);  
			return null;
		}
	}
	
	public String editarGerente() {
		
		if (this.gerenteSeleccionado != null) {
			
			this.panelEditarVisibilidad = true;
			this.panelRegistrarVisibilidad = false;
			this.panelBuscarVisibilidad = false;
			
			this.localidadAux = this.gerenteSeleccionado.getLocalidad();
			this.nombreLocalidad = this.gerenteSeleccionado.getLocalidad().getNombre();
			
			//para eliminar la localidad que tenia... asi no aparece dos veces
			for(int i = 0; i < localidades.size(); i++){
				if (localidadAux.getNombre().equals(localidades.get(i).getNombre())) {
					localidades.remove(i);
				}
			}
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No ha seleccionado ningun elemento.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}
	
	public String eliminarGerente() {
		
		if (this.gerenteSeleccionado != null) {

			try {
				ServiceLocator.getUsuarioService().eliminarGerente(this.gerenteSeleccionado);
			} catch (Exception e) {

				FacesMessage message2 = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", Mensajes.ELEMENTO_ASIGNADO);  
				RequestContext.getCurrentInstance().showMessageInDialog(message2);
				return null;
			}

			this.gerenteSeleccionado = null;
			this.gerentes = ServiceLocator.getUsuarioService().buscarGerente(codigoBuscar, apellidoBuscar, nombreBuscar, estadoBuscar);

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.OPERACION_EXITOSA);  
			RequestContext.getCurrentInstance().showMessageInDialog(message);			
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.ELEMENTO_NO_SELECCIONADO);  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}

	public String buscarGerente() {
		
		this.gerentes = ServiceLocator.getUsuarioService().buscarGerente(codigoBuscar, apellidoBuscar, nombreBuscar, estadoBuscar);

		if (this.gerentes != null && !this.gerentes.isEmpty()) {

			return null;

		} else {

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No se encotraron resultados para la busqueda.");  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;		
		}
	}
	
	public void visibilizarBuscar() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = false;
	}
	
	public void visibilizarRegistrar() {
		
		panelBuscarVisibilidad = false;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = true;
	}
	
	public void volverBusqueda() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		this.gerentes = ServiceLocator.getUsuarioService().buscarGerente(codigoBuscar, apellidoBuscar, nombreBuscar, estadoBuscar);
	}
}
